import 'dart:math';

class UUIDUtils {
  /// 生成随机UUID并返回其mostSignificantBits（高位64位）
  static int getRandomUUIDMostSignificantBits() {
    // 生成随机UUID字符串，格式为 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
    final random = Random.secure();
    final values = List<int>.generate(16, (_) => random.nextInt(256));

    // 设置UUID版本为4（随机生成）
    values[6] = (values[6] & 0x0F) | 0x40; // 版本4
    values[8] = (values[8] & 0x3F) | 0x80; // 变体10

    // 转换为UUID字符串
    final uuid = _formatAsUUID(values);

    // 解析UUID并提取mostSignificantBits
    return _parseMostSignificantBits(uuid);
  }

  /// 将字节列表格式化为UUID字符串
  static String _formatAsUUID(List<int> bytes) {
    return '${_toHex(bytes, 0, 4)}-${_toHex(bytes, 4, 2)}-${_toHex(bytes, 6, 2)}-'
        '${_toHex(bytes, 8, 2)}-${_toHex(bytes, 10, 6)}';
  }

  /// 将字节转换为16进制字符串
  static String _toHex(List<int> bytes, int start, int length) {
    if (start < 0 || length < 0 || start + length > bytes.length) {
      throw RangeError.range(start, 0, bytes.length - length, 'start');
    }
    return bytes.sublist(start, start + length)
        .map((byte) => byte.toRadixString(16).padLeft(2, '0'))
        .join();
  }

  /// 从UUID字符串解析出mostSignificantBits
  static int _parseMostSignificantBits(String uuid) {
    // 移除连字符并分割为高位和低位部分
    final cleanUuid = uuid.replaceAll('-', '');
    final highPart = cleanUuid.substring(0, 16);

    // 解析高位部分为BigInt
    final highBigInt = BigInt.parse(highPart, radix: 16);

    // 转换为有符号64位整数（Java的long类型）
    return _toSigned64(highBigInt);
  }

  // 将 BigInt 转换为有符号 64 位整数
  static int _toSigned64(BigInt value) {
    if (value >= BigInt.one << 63) {
      return (value - (BigInt.one << 64)).toInt();
    } else {
      return value.toInt();
    }
  }
}
